package com.moon.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;
import java.util.*;

@Configuration
public class DynamicDataSourceConfig {

    @Bean("defaultDataSource")
    @ConfigurationProperties("spring.datasource.default")
    public DataSource defaultDataSource() {
        return new DriverManagerDataSource();
    }

    @Bean("db02DataSource")
    @ConfigurationProperties("spring.datasource.db02")
    public DataSource db02DataSource() {
        return new DriverManagerDataSource();
    }

    /**
     * 配置动态数据源
     *
     * 该方法配置了一个动态数据源，允许在多个数据源之间进行切换
     * 主要通过构建一个 DynamicRoutingDataSource 实例，并设置其默认数据源与目标数据源映射
     *
     * @param defaultDataSource 默认数据源，当未指定特定数据源时使用
     * @param db02DataSource 名为 db02 的数据源，可通过特定条件选择使用
     * @return 返回配置好的 DynamicRoutingDataSource 实例
     */
    @Primary
    @Bean
    public DataSource dynamicDataSource(DataSource defaultDataSource, DataSource db02DataSource) {

        // 创建 DynamicRoutingDataSource 实例
        DynamicRoutingDataSource ds = new DynamicRoutingDataSource();
        // 设置默认数据源
        ds.setDefaultTargetDataSource(defaultDataSource);

        // 初始化目标数据源映射
        Map<Object, Object> targetDataSources = new HashMap<>();
        // 将默认数据源添加到目标数据源映射中
        targetDataSources.put("default", defaultDataSource);
        // 将 db02 数据源添加到目标数据源映射中
        targetDataSources.put("db02", db02DataSource);
        // 设置目标数据源映射
        ds.setTargetDataSources(targetDataSources);
        // 返回配置好的动态数据源实例
        return ds;
    }

}
